package cn.dongqihong.oauth2.common;

import com.alibaba.fastjson.JSON;

/**
 * API 返回结果封装类
 */
public class ApiResult {
    /**
     * code
     */
    private Integer code;

    /**
     * msg
     */
    private String msg;

    /**
     * data
     */
    private Object data;


    /**
     * 默认构建方法
     */
    public ApiResult() {
    }

    /**
     * 通过返回状态码构建
     *
     * @param resultCode 返回状态码
     */
    public ApiResult(ApiResultCode resultCode) {
        this.code = resultCode.code();
        this.msg = resultCode.msg();
    }

    /**
     * 通过状态码与状态描述构建
     *
     * @param code 编号
     * @param msg  消息
     */
    public ApiResult(int code, String msg) {
        this.code = code;
        this.msg = msg;
    }

    /**
     * 通过状态码与状态描述和Data数据构建
     *
     * @param code
     * @param msg
     * @param data
     */
    public ApiResult(int code, String msg, Object data) {
        this.code = code;
        this.msg = msg;
        this.data = data;
    }

    /**
     * 成功
     *
     * @return 返回对象
     */
    public static String success() {
        return new ApiResult(ApiResultCode.SUCCESS).toJsonStr();
    }

    /**
     * 成功附带数据
     *
     * @param data 附带数据
     * @return 返回对象
     */
    public static String success(Object data) {
        ApiResult result = new ApiResult(ApiResultCode.SUCCESS.code(), ApiResultCode.SUCCESS.msg(), data);
        return result.toJsonStr();
    }

    /**
     * 默认失败
     *
     * @return 返回 code 为 -1，msg 为 系统内部错误 的返回对象
     */
    public static String failure() {
        ApiResult result = new ApiResult(ApiResultCode.ERROR);
        return result.toJsonStr();
    }

    /**
     * 通过返回码
     *
     * @param code 返回码
     * @param msg  提示信息
     * @return
     */
    public static ApiResult create(int code, String msg) {
        return new ApiResult(code, msg);
    }

    /**
     * 通过ApiResultCode创建返回对象
     *
     * @param apiResultCode api返回代码创建
     * @return 返回对象
     */
    public static ApiResult create(ApiResultCode apiResultCode) {
        return new ApiResult(apiResultCode);
    }

    /**
     * 通过ApiResultCode创建返回对象
     *
     * @param apiResultCode api返回代码创建
     * @param msg           自定义详细信息
     * @return 返回对象
     */
    public static ApiResult create(ApiResultCode apiResultCode, String msg) {
        return new ApiResult(apiResultCode.code(), msg);
    }

    /**
     * 返回Json字符串
     *
     * @return
     */
    public String toJsonStr() {
        return JSON.toJSONString(this);
    }

    public Integer getCode() {
        return code;
    }

    public String getMsg() {
        return msg;
    }

    public Object getData() {
        return data;
    }

}
